scrapy網路上有很多教學
scrapy的教學
scrapy的文件
不一定是最正確,但我習慣這樣設定,如果你遇到問題了可以參考看看
最重要的參數
CONCURRENT_REQUESTS: 16
多線程調越小越好,不要把別人網站爬壞,如果被封ip就要換proxy了
我會先調1如果真的太慢才會慢慢調上去
如果是爬很多不同的網站,可以調高點但是
CONCURRENT_REQUESTS_PER_DOMAIN 還是設定1
最重要的參數
DOWNLOAD_DELAY: 0
延遲調越高越好,不要把別人網站爬壞,如果太低可能爬一段時間就爬不到資料,如果爬不到就一直往上加,有的還要調到10秒才爬得到
RETRY_TIMES: 2
預設的錯誤重試次數是2,有點少我會改多一點
'RETRY_TIMES': 5
RETRY_HTTP_CODES
Default: [500, 502, 503, 504, 408]
預設會重試有這些,會加上一些很常見的
'RETRY_HTTP_CODES': [400, 404, 500, 502, 503, 504, 408]
HTTPERROR_ALLOW_ALL : False
scrapy會自動忽略錯誤繼續執行下去,如果想要知道哪些網站錯誤,除了看log
也可以改成 True,把錯誤的也經過parse寫進去,之後再針對爬不到的重新爬取
COOKIES_ENABLED: True
如果這個網站可以不用cookies可以關掉,避免被發現爬蟲
ROBOTSTXT_OBEY = True
有的網站會叫你不要爬,scrapy就不會爬,改成False
客製化設定
通常一個scrapy project會有很多爬蟲
可以針對個別網站做設定覆蓋掉settings.py的設定,對應不同網站的反爬蟲
custom_settings = {
'DOWNLOAD_DELAY': 1,
'CONCURRENT_REQUESTS': 1,
'MONGODB_COLLECTION': 'stock_day',
'MONGODB_ITEM_CACHE': 1,
'MONGODB_HAS_ID_FIELD': True,
'MONGODB_UNIQ_KEY': [("date", -1), ("code", 1)],
'COOKIES_ENABLED': False,
}
這個設定裡面的參數,很多是自定義的方法
自定義方法可以用crawler.settings.get方式讀取到設定
例如自定義的
class PyQueryMiddleware(object):
def __init__(self, parser):
self.parser = parser
@classmethod
def from_crawler(cls, crawler):
return cls(crawler.settings.get('PyQueryPARSER', None))
自定義的寫入mongodb
@classmethod
def from_crawler(cls, crawler):
settings = crawler.settings
return cls(settings.get('MONGODB_SERVER', 'localhost'), settings.get('MONGODB_PORT', 27017),
settings.get('MONGODB_DB', None), settings.get('MONGODB_COLLECTION', None),
settings.get('MONGODB_UNIQ_KEY', None), settings.get('MONGODB_HAS_ID_FIELD', False),
settings.get('MONGODB_ITEM_CACHE', 1000), settings.get('MONGODB_DROP', False))
自定義方法
數字越小越優先,預設的UserAgentMiddleware只有一個,如果要自定每次都不同的UserAgent,如果不知道預設的優先順序可以設定成None關掉
DOWNLOADER_MIDDLEWARES = {
'opendata.middlewares.PyQueryMiddleware': 543,
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'opendata.middlewares.RandomUserAgent': 400,
}
可以省略
我是不寫item如果每個網站都要寫item會很累,有的一個網站要爬20幾個欄位,直接在parse傳出dict格式就好